package editorsvg.editor.documento;

import editorsvg.editor.estilo.Estilo;
import editorsvg.editor.formas.Forma;
import editorsvg.editor.formas.Linea;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.geom.Rectangle2D;

/**
 *
 * @author Jorge Berjano
 */
public class ElementoForma extends ElementoGrafico {

    private Forma forma;
    private Estilo estilo = new Estilo();

    public ElementoForma(Forma forma) {
        assert (forma != null);
        this.forma = forma;
        agregarPropiedades(getForma().obtenerPropiedades());
        agregarPropiedades(getEstilo().obtenerPropiedades());
        setNombreTag(forma.getNombreTag());
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        ElementoForma clon = (ElementoForma) super.clone();
        clon.forma = (Forma) forma.clone();
        clon.forma.obtenerPropiedades().asignarObjeto(clon.forma);

        clon.estilo = (Estilo) estilo.clone();
        clon.estilo.obtenerPropiedades().asignarObjeto(clon.estilo);

        clon.agregarPropiedades(clon.forma.obtenerPropiedades());
        clon.agregarPropiedades(clon.estilo.obtenerPropiedades());

        return clon;
    }

    @Override
    public void actualizar() {
        getForma().actualizar();
    }

    @Override
    public Rectangle2D getEncuadre() {
        if (forma instanceof Linea) {
            return getShapeTransformado().getBounds2D();
        }

        Shape shape = getShapeTransformado();
        Area area = new Area(shape);
        return area.getBounds2D();
    }
    
    public Shape getShapeTransformado() {
        Shape s = getForma().getShape();
        return getTransformacion().transformar(s);
    }

    public Shape getContorno() {
        return getShapeTransformado();
    }



    @Override
    public void pintar(Graphics2D graphics) {

        AffineTransform transfomacionInicial = graphics.getTransform();
        if (getTransformacion().getAffineTransform() != null) {
            graphics.transform(getTransformacion().getAffineTransform());
        }

        Shape shape = getForma().getShape();
        if (shape != null) {
            if (getEstilo().establecerRelleno(graphics)) {
                graphics.fill(shape);
            }
            if (getEstilo().establecerTinta(graphics)) {
                graphics.draw(shape);
            }
        }

        graphics.setTransform(transfomacionInicial);
    }

//    public void pintar(Graphics2D graphics) {
//        Shape shape = getShapeTransformado();
//        if (shape != null) {
//            if (getEstilo().establecerRelleno(graphics)) {
//                graphics.fill(shape);
//            }
//            if (getEstilo().establecerTinta(graphics)) {
//                graphics.draw(shape);
//            }
//        }
//
//    }
    
    public Forma getForma() {
        return forma;
    }

//    public void setForma(Forma forma) {
//        this.forma = forma;
//    }
    public Estilo getEstilo() {
        return estilo;
    }
//
//    public void setEstilo(Estilo estilo) {
//        this.estilo = estilo;
//    }
}
